package Linux五种IO模型;

/**
 * @author coderFu
 * @create 2022/3/4
 * java中的IO 和操作系统中的IO的比较
 */
public class IOCompare {

    /**
     * java中的IO
     * 主要有三种：  阻塞IO （BIO） 、 非阻塞IO（NIO、异步IO（AIO）
     * java中的IO从本质上都是依赖操作系统的IO操作实现的
     * 在Linux2.6以后，Java中的NIO和AIO都是通过Epoll来实现的
     * 在Windows 中，AIO通过IOCP来实现
     * java中的各种IO都是对操作系统IO模型的封装
     * Linux中的IO
     * 阻塞IO 非阻塞IO模型。IO复用模型，信号驱动，异步IO模型
     * @param args
     */

    public static void main(String[] args) {

        /**
         * 什么是IO：
         * IO就是指文件的输入与输出，但是在操作系统上如何定义IO呢，
         * 拿一次磁盘文件读取为例，我们要读取的文件是存储在磁盘上的，
         * 我们的目的是把它读取到内存中。简化为从数据库硬盘中读取到用户
         * 空间中。
         *
         * 一次IO 是指： 将文件从硬盘中放到（拷贝）到用户空间的过程。
         *
         * IO
         * 从java语言的层面来说，文件的读取和网络socket接收与发送就涉及
         * 到IO，通过IO来完成文件的读取和网络Socket的接受和发送。
         * 从操作系统的层面来说，IO就是，通过内核空间将文佳从磁盘文件拷贝
         * 到用户空间里面。
         */


        /**
         * 阻塞IO
         * 表现为：进程或线程，等待某个条件，如果条件不满足，则一直等下去
         * ，条件满足，则进行下一步操作。
         * 用户线程一直处于阻塞的状态，等待操作系统的数据到来！！
         */

        // 请求过程： 用户空间内的线程 --》 系统调用
        // 内核空间，从无数据--》等待到有数据
        // 内核空间：复制数据到--》用户空间
        // 内核返回成功： 用户空间得到数据--》传输完成


        /**
         * 非阻塞IO
         * 表现为：用户进程或线程，不再一味的等待，而是直接返回
         * 通过轮询的方式，不停的去问内核数据是否准备好，当准备好的
         * 时候，就可以把数据拷贝到用户空间中。
         */

        //请求过程： 用户空间内的线程 --》 系统调用
        //内核空间： 无数据 --》直接返回 状态 （用户线程或进程不再阻塞）
        // 内核空间： 有数据--复制数据到用户空间 （用户阻塞等待）
        // 内核返回成功

        /**
         * 信号驱动IO模型
         * 应用进程在读取文件时通知内核，如果某个socket的某个事件发生
         * 请向我发送一个信号，收到信号后函数会进行后续处理
         * 应用进程预先向内核注册一个信号处理函数，　然后用户进程返回，
         * 并且不阻塞，当内核数据准备就绪时就会发一个信号给进程
         * 用户进程便在信号处理函数中开始把数据拷贝到用户空间里。
         */

        // 首先  建立系统signal的信号处理程序（用户进程和操作系统）
        // 当数据准备好： 操作系统递交signal --》 用户进程
        // 用户发起 recvfrom 系统调用
        // 内核空间： 将数据复制到用户空间中
        // 内核空间：返回成功状态。

        /**
         * IO复用模型
         * 多个进程的IO可以注册到同一个管道上，这个管道
         * 会统一和内核进行交互，当管道中的某一个请求
         * 需要的数据准备好之后，进程再把对应的数据拷贝到用户空间
         */

        // 首先 ：发起select 调用，注册到内核空间 将多个进程的IO注册
        //到同一个select上，用户调用该select会监听所有注册好的IO
        // 如果没有准备好： select调用会阻塞。可轮询！

        /**
         * 以上四种IO都是同步的，
         * 阻塞IO，非阻塞IO，信号驱动IO，IO复用模型都是
         * 属于同步IO。因为在数据从内核空间，到用户空间的过程
         * 都是阻塞的。
         */


        /**
         * 异步IO模型：
         * 应用进程把IO请求传给内核后，完全由内核去操作文件拷贝
         * 内核完成相关操作后，会发信号告诉进程本次IO已完成
         */

        // 用户空间的用户进程向内核发送--》 aio_read
        // 内核空间有数据准备好，并且拷贝到用户空间后 告诉用户
        // 内核空间发送成功信号。









    }
}
